//
//  HttpRequest.h
//  EZC_Library
//
//  Created by ellzu on 14-9-23.
//  Copyright (c) 2014年 ellzu. All rights reserved.
//

#ifndef __EZC_Library__HttpRequest__
#define __EZC_Library__HttpRequest__

#include <stdio.h>
#include <string>
#include <map>
#include "EZTally/EZTallyObject.h"
#include "HttpRequestPlatformInterface.h"
#include "HttpResponse.h"
#include "HttpRequestDelegate.h"

namespace EZHttp {
    
    class HttpRequest : public EZTally::EZTallyObject
    {
    public:
        /**
         创建一个http请求，必须指定一个http相对平台实现  可以使用 HttpRequestFactory 创建默认的请求
         */
        HttpRequest(HttpRequestPlatformInterface *hrpi);
    protected:
        virtual ~HttpRequest();
        
        
    public:
        /**
         URL
         **/
        void setUrl(const std::string &url);
        std::string url();
        
        /**
         请求方式 GET PUSH POST
         **/
        std::string method();
        void setMethod(const std::string &method);
        
        /**
         发送到服务器的值
         **/
        void setRequestValue(const std::string &key,const std::string &value);
        std::string requestValue(const std::string &key);
        
        /**
         http头文件
         **/
        void setHeader(const std::string &key,const std::string &value);
        std::string header(const std::string &key);
        
        /**
         同步请求
         **/
        void startSync();
        /**
         导步请求
         **/
        void startAsync();
        
        /***
         http的平台实现，使用者无需理会
         ***/
        HttpRequestPlatformInterface* HRPI();
        
        /**
         最终下载路径，如无则保存在临时文件处
         **/
        void setDownLoadPath(const std::string &path);
        std::string downLoadPath();
        
        /**
         临时文件路径，如无则存在内存
         **/
        void setTempPath(const std::string &path);
        std::string tempPath();
        
        /**
         http服务器应答数据
         **/
        HttpResponse *response();
        
        /**
         设置回调
         **/
        void setDelegate(HttpRequestDelegate *delegate);
        HttpRequestDelegate* delegate();
        
        /**
         进度通知最大次数,默认100次，不足%1的变化不会通知
         **/
        void setProgressCount(int);
        int progressCount();
        
    protected:
        friend class HttpRequestPlatformInterface;
        std::string _url;
        std::string _method;
        std::map<std::string,std::string> _requestValues;
        std::map<std::string,std::string> _headers;
        
        std::string _downLoadPath;
        std::string _tempPath;
        
        void setHRPI(HttpRequestPlatformInterface *hrpi);
        HttpRequestPlatformInterface *_hrpi;
        
        void setResponse(HttpResponse *response);
        HttpResponse *_response;
        
        HttpRequestDelegate *_delegate;
        
        unsigned int _progressCount;
    };
}

#endif /* defined(__EZC_Library__HttpRequest__) */
